home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / ubppmpqs.zip / ppmp2p.asm < prev    next >
Assembly Source File  |  1992-05-10  |  14KB  |  938 lines

  1. ;PPMP2P.ASM 2.0
  2. ;    MACHINE LANGUAGE SUBROUTINES
  3. ;    FOR PPMPQS
  4. ;    PROTECT MODE part
  5. ;    1991/92 by YUJI KIDA
  6. ;
  7. .386P
  8. pmode    segment para public use32
  9.     assume    cs:pmode,ds:pmode
  10.  
  11.     include    ppmp.h
  12.  
  13.     org    100h
  14. start:
  15.  
  16. pmodesetR1R2:
  17.     mov    ax,10h
  18.     mov    ds,ax
  19.     mov    es,ax
  20.     mov    fs,ax
  21.     mov    gs,ax
  22.  
  23.     ; loop for primes
  24.  
  25.     mov    esi,primeadr2+2*primeunitbytes    ;skip sign & 2
  26.     mov    ecx,ds:[_primes]
  27.     sub    ecx,2            ;skip sign & 2
  28.     sub    ecx,ds:[_primes3B]
  29.     sub    ecx,ds:[_primes4]
  30.     mov    ebx,2
  31. align 4
  32. R1R2loop:
  33.     push    ecx
  34.     movzx    eax,word ptr [esi]
  35.     add    ebx,eax
  36.  
  37.     call    setparam
  38.     add    esi,primeunitbytes
  39.     pop    ecx
  40.     loop    R1R2loop
  41.  
  42.     mov    ecx,ds:[_primes3B]
  43.     add    ecx,ds:[_primes4]
  44.     jecxz    short R1R2out
  45.     mov    esi,primeadr
  46. align 4
  47. R1R2loopB:
  48.     push    ecx
  49.     movzx    eax,word ptr [esi]
  50.     add    ebx,eax
  51.  
  52.     call    setparam
  53.     add    esi,primeunitbytes
  54.     pop    ecx
  55.     loop    R1R2loopB
  56.  
  57. R1R2out:
  58.     ; return to real mode
  59.  
  60.     db    0eah
  61.     dd    104h        ;32 bit offset
  62.     dw    18h        ;gdt_code16 - gdttbl
  63.  
  64.     ;data structure
  65.     ; prime diff    2bytes
  66.     ; log(P)     2bytes(higher=0)
  67.     ; sqrt(WN) @ P    4bytes
  68.     ; start1    4 bytes
  69.     ; start2    4 bytes
  70.     ; ( total    10h bytes=primeunitbytes)
  71.  
  72.     ; calc parameters for each prime
  73. setparam:
  74.     push    esi
  75.     mov    esi,_D+12
  76.  
  77.     xor    edx,edx
  78.     std
  79.     rept    3
  80.       lodsd
  81.       div    ebx
  82.     endm
  83.     cld
  84.  
  85.     mov    eax,edx
  86.     shl    eax,1
  87.     mul    edx
  88.     div    ebx
  89.     mov    eax,edx
  90.  
  91.     call    ax_modinv_bx
  92.  
  93.     mov    ds:[_MIA2P],eax    ;set 1/(2A) @ P
  94.  
  95.     mov    esi,_B+20
  96.  
  97.     xor    edx,edx
  98.     std
  99.     rept    5
  100.       lodsd
  101.       div    ebx
  102.     endm
  103.     cld
  104. ;//
  105.     pop    esi
  106.     mov    eax,[esi+4]
  107.     add    edx,eax
  108.     cmp    edx,ebx
  109.     jbe    short setparamj1
  110.     sub    edx,ebx
  111. setparamj1:
  112.     mov    eax,ebx
  113.     sub    eax,edx            ;(-B-R)@P
  114.  
  115.     mul    dword ptr ds:[_MIA2P]
  116.     div    ebx            ;edx = (-B-R)@P/2A@P
  117.  
  118.     mov    eax,edx
  119.     add    eax,ds:[_sievewidth]
  120.     xor    edx,edx
  121.     div    ebx
  122.     mov    [esi+8],edx        ;((-B-R)@P/2A+M)@P
  123.  
  124.     mov    eax,[esi+4]
  125.     shl    eax,1
  126.     mul    dword ptr ds:[_MIA2P]    ;2R/2A
  127.     div    ebx            ;edx = 2R/2A@P
  128.     add    edx,[esi+8]
  129.     cmp    edx,ebx
  130.     jb    short setparamj3
  131.     sub    edx,ebx
  132. setparamj3:
  133.     add    edx,ds:[_sievetop]
  134.     mov    [esi+12],edx        ;((-B+R)@P/2A+M)@P
  135.     mov    eax,[esi+8]
  136.     add    eax,ds:[_sievetop]
  137.     mov    [esi+8],eax
  138.     ret
  139.  
  140.  
  141.     org    280h
  142.  
  143.     ; * sieve process
  144.  
  145. pmodesieve:
  146.     mov    ax,10h
  147.     mov    ds,ax
  148.     mov    es,ax
  149.  
  150.     ; set initial value
  151.  
  152.     push    ebp
  153.     mov    ebp,ds:[_sieveBsize]
  154.  
  155.     mov    edi,ds:[_sievetop]
  156.     mov    ecx,ebp
  157.     shr    ecx,2
  158.     inc    ecx
  159.     mov    eax,ds:[_inilog]
  160.     rep    stosd
  161.  
  162.     mov    edx,ds:[_sieveover]
  163.  
  164.     ; sieve main1 start
  165.  
  166.     mov    esi,primeadr2+2*primeunitbytes    ;skip sign & 2
  167.     mov    ecx,ds:[_primes]
  168.     sub    ecx,ds:[_primes1]    ;cut primes > sieveXsize
  169.     sub    ecx,ds:[_primes2]    ;cut primes > sieveDsize
  170.     sub    ecx,ds:[_primes3A]    ;cut primes > sieveWsize
  171.     sub    ecx,ds:[_primes3B]    ;cut primes > sieveWsize
  172.     sub    ecx,ds:[_primes4]    ;cut primes > sieveBsize
  173.     sub    ecx,2            ;skip sign & 2
  174.     mov    ebx,2
  175. align 4
  176. primeloop:
  177.     push    ecx
  178.     movzx    eax,word ptr [esi]
  179.     add    ebx,eax
  180.  
  181.     mov    eax,ebx
  182.     shl    eax,sieveRepLog
  183.     sub    eax,ebx
  184.     mov    ecx,edx
  185.     sub    ecx,eax        ;ecx = sieveover - (sieveRep-1)*prime
  186.  
  187.     mov    eax,esi            ;push    esi
  188.     shl    eax,8            ;
  189.  
  190.     mov    al,[esi+2]    ;log
  191.  
  192.     mov    edi,[esi+8]
  193.     mov    esi,[esi+12]
  194.     cmp    esi,edi
  195.     jbe    short setlogp10
  196.     xchg    esi,edi
  197. setlogp10:
  198.     sub    esi,edi
  199.  
  200. align 4
  201. setlogplp1:
  202.   rept    sieveRep
  203.     sub    [edi],al
  204.     sub    [edi+esi],al
  205.     add    edi,ebx
  206.   endm
  207.     cmp    edi,ecx
  208.     jb    setlogplp1
  209.  
  210.   rept    sieveRep-1
  211.     cmp    edi,edx
  212.     jae    short setlogp30
  213.     sub    [edi],al
  214.     sub    [edi+esi],al
  215.     add    edi,ebx
  216.   endm
  217. setlogp30:
  218.     add    esi,edi
  219.     cmp    esi,edx
  220.     jae    short setlogp40
  221.     sub    [esi],al
  222.     add    esi,ebx
  223. setlogp40:
  224.     xchg    eax,esi            ;pop    esi
  225.     shr    esi,8            ;
  226.  
  227.     sub    edi,ebp            ;ds:[_sieveBsize]
  228.     mov    [esi+8],edi
  229.     sub    eax,ebp
  230.     mov    [esi+12],eax
  231.  
  232.     add    esi,primeunitbytes
  233.     pop    ecx
  234.     dec    ecx
  235.     jnz    primeloop
  236.  
  237.     ; sieve main1 end
  238.  
  239.     ; sieve main2 start
  240.     ; 4 or 8 times
  241.  
  242.     mov    ecx,ds:[_primes1]
  243.     or    ecx,ecx
  244.     jz    sievemain3
  245. align 4
  246. primeloop2:
  247.     movzx    eax,word ptr [esi]
  248.     add    ebx,eax
  249.  
  250.     mov    eax,esi            ;push    esi
  251.     shl    eax,8            ;
  252.  
  253.     mov    al,[esi+2]        ;log
  254.  
  255.     mov    edi,[esi+8]
  256.     mov    esi,[esi+12]
  257.     cmp    esi,edi
  258.     jbe    short setlogp100
  259.     xchg    esi,edi
  260. setlogp100:
  261.     sub    esi,edi
  262.   rept    4
  263.     sub    [edi],al
  264.     sub    [edi+esi],al
  265.     add    edi,ebx
  266.   endm
  267.   rept    4
  268.     cmp    edi,edx
  269.     jae    short setlogp130
  270.     sub    [edi],al
  271.     sub    [edi+esi],al
  272.     add    edi,ebx
  273.   endm
  274.  
  275. setlogp130:
  276.     add    esi,edi
  277.     cmp    esi,edx
  278.     jae    short setlogp140
  279.     sub    [esi],al
  280.     add    esi,ebx
  281.  
  282. setlogp140:
  283.     xchg    eax,esi            ;pop    esi
  284.     shr    esi,8            ;
  285.  
  286.     sub    edi,ebp            ;ds:[_sieveBsize]
  287.     mov    [esi+8],edi
  288.     sub    eax,ebp
  289.     mov    [esi+12],eax
  290.  
  291.     add    esi,primeunitbytes
  292.     dec    ecx
  293.     jnz    primeloop2
  294.  
  295.     ; sieve main2 end
  296.  
  297.     ; sieve main3 start
  298.     ; 2 or 4 times
  299.  
  300. align    4
  301. sievemain3:
  302.     mov    ecx,ds:[_primes2]
  303.     jecxz    short sievemain4
  304. align 4
  305. primeloop3:
  306.     movzx    eax,word ptr [esi]
  307.     add    ebx,eax
  308.  
  309.     mov    al,[esi+2]        ;log
  310.     mov    edi,[esi+8]
  311.  
  312.   rept    2
  313.     sub    [edi],al
  314.     add    edi,ebx
  315.     endm
  316.   rept    2
  317.     cmp    edi,edx
  318.     jae    short setlogp310
  319.     sub    [edi],al
  320.     add    edi,ebx
  321.   endm
  322.  
  323. setlogp310:
  324.     sub    edi,ebp            ;ds:[_sieveBsize]
  325.     mov    [esi+8],edi
  326.  
  327.     mov    edi,[esi+12]
  328.   rept    2
  329.     sub    [edi],al
  330.     add    edi,ebx
  331.   endm
  332.   rept    2
  333.     cmp    edi,edx
  334.     jae    short setlogp320
  335.     sub    [edi],al
  336.     add    edi,ebx
  337.   endm
  338.  
  339. setlogp320:
  340.     sub    edi,ebp            ;ds:[_sieveBsize]
  341.     mov    [esi+12],edi
  342.  
  343.     add    esi,primeunitbytes
  344.     loop    primeloop3
  345.  
  346.     ; sieve main3 end
  347.  
  348.     ; sieve main4 start
  349.     ; 1 or 2 times
  350.  
  351. align 4
  352. sievemain4:
  353.     mov    ecx,ds:[_primes3A]
  354.     jecxz    short sievemain4B
  355. align 4
  356. primeloop4:
  357.     movzx    eax,word ptr [esi]
  358.     add    ebx,eax
  359.  
  360.     mov    al,[esi+2]        ;log
  361.     mov    edi,[esi+8]
  362.     sub    [edi],al
  363.     add    edi,ebx
  364.     cmp    edi,edx
  365.     jae    short setlogp410
  366.     sub    [edi],al
  367.     add    edi,ebx
  368. align    4
  369. setlogp410:
  370.     sub    edi,ebp            ;ds:[_sieveBsize]
  371.     mov    [esi+8],edi
  372.  
  373.     mov    edi,[esi+12]
  374.     sub    [edi],al
  375.     add    edi,ebx
  376.     cmp    edi,edx
  377.     jae    short setlogp420
  378.     sub    [edi],al
  379.     add    edi,ebx
  380. align    4
  381. setlogp420:
  382.     sub    edi,ebp            ;ds:[_sieveBsize]
  383.     mov    [esi+12],edi
  384.  
  385.     add    esi,primeunitbytes
  386.     loop    primeloop4
  387.  
  388. align 4
  389. sievemain4B:
  390.     mov    ecx,ds:[_primes3B]
  391.     jecxz    short sievemain5
  392.     mov    esi,primeadr
  393. align 4
  394. primeloop4B:
  395.     movzx    eax,word ptr [esi]
  396.     add    ebx,eax
  397.  
  398.     mov    al,[esi+2]        ;log
  399.     mov    edi,[esi+8]
  400.     sub    [edi],al
  401.     add    edi,ebx
  402.     cmp    edi,edx
  403.     jae    short setlogp410B
  404.     sub    [edi],al
  405.     add    edi,ebx
  406. align    4
  407. setlogp410B:
  408.     sub    edi,ebp            ;ds:[_sieveBsize]
  409.     mov    [esi+8],edi
  410.  
  411.     mov    edi,[esi+12]
  412.     sub    [edi],al
  413.     add    edi,ebx
  414.     cmp    edi,edx
  415.     jae    short setlogp420B
  416.     sub    [edi],al
  417.     add    edi,ebx
  418. align    4
  419. setlogp420B:
  420.     sub    edi,ebp            ;ds:[_sieveBsize]
  421.     mov    [esi+12],edi
  422.  
  423.     add    esi,primeunitbytes
  424.     loop    primeloop4B
  425.  
  426.     ; sieve main4 end
  427.  
  428.     ; sieve main5 start
  429.     ; 0 or 1 time
  430.  
  431. align    4
  432. sievemain5:
  433.     mov    ecx,ds:[_primes4]
  434.     jecxz    short sievedone
  435.     cmp    esi,primeadr
  436.     jae    short primeloop5
  437.     mov    esi,primeadr
  438. align 4
  439. primeloop5:
  440.     movzx    eax,word ptr [esi]
  441.     add    ebx,eax
  442.  
  443.     mov    al,[esi+2]        ;log
  444.     mov    edi,[esi+8]
  445.     cmp    edi,edx
  446.     jae    short setlogp510
  447.     sub    [edi],al
  448.     add    edi,ebx
  449. align    4
  450. setlogp510:
  451.     sub    edi,ebp            ;ds:[_sieveBsize]
  452.     mov    [esi+8],edi
  453.  
  454.     mov    edi,[esi+12]
  455.     cmp    edi,edx
  456.     jae    short setlogp520
  457.     sub    [edi],al
  458.     add    edi,ebx
  459. align    4
  460. setlogp520:
  461.     sub    edi,ebp            ;ds:[_sieveBsize]
  462.     mov    [esi+12],edi
  463.  
  464.     add    esi,primeunitbytes
  465.     loop    primeloop5
  466.  
  467.     ; sieve main5 end
  468.  
  469. align    4
  470. sievedone:
  471.     mov    al,ds:[_cutlog]
  472.     mov    edx,ds:[_sievetop]
  473.  
  474.     mov    ebx,sieveansarea
  475.     mov    word ptr [ebx],0
  476.     mov    esi,sieveansarea+4
  477.     mov    edi,edx            ;ds:[_sievetop]
  478.     mov    ecx,ebp            ;ds:[_sieveBsize]
  479. align 4
  480. sieveanslp:
  481.     scasb
  482.     ja    short sieveansfind
  483. sieveansnext:
  484.     loop    sieveanslp
  485.  
  486.     ; return to real mode
  487. sieveansret:
  488.     pop    ebp
  489.  
  490.     db    0eah
  491.     dd    104h        ;32 bit offset
  492.     dw    18h        ;gdt_code16 - gdttbl
  493.  
  494.  
  495. sieveansfind:
  496.     sub    edi,edx        ;ds:[_sievetop]
  497.     dec    edi
  498.     mov    [esi],edi    ;result
  499.     add    edi,edx        ;ds:[_sievetop]
  500.     inc    edi
  501.     add    esi,4
  502.     inc    word ptr [ebx]    ;# of results
  503.     jmp    sieveansnext
  504.  
  505.  
  506.  
  507.     org    700h
  508. decompose:
  509.     mov    ax,10h
  510.     mov    ds,ax
  511.     mov    es,ax
  512.  
  513.     push    ebp
  514.  
  515.     movzx    eax,word ptr ds:[_absQ+2]
  516.     shl    eax,4
  517.     movzx    esi,word ptr ds:[_absQ]
  518.     add    esi,eax        ;absolute adr of W#
  519.     push    esi        ;*
  520.  
  521.     mov    ebx,_W
  522.     mov    edi,ebx        ;set in _W by dword format
  523.     xor    eax,eax
  524.     lodsw
  525.     mov    ecx,eax
  526.     inc    eax
  527.     shr    eax,1
  528.     stosd
  529.     rep    movsw
  530.     xor    eax,eax
  531.     stosw
  532.  
  533.     ; divide by p=2
  534. decomp2:
  535.     cmp    dword ptr [ebx+4],0
  536.     jne    sho